home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Collections: Purity
/
Purity #48 (1995-06-25)(PackMAN)(DE)[WB].zip
/
Purity #48 (1995-06-25)(PackMAN)(DE)[WB].adf
/
Spiele
/
Buggers.p
< prev
next >
Wrap
Text File
|
1995-06-24
|
7KB
|
298 lines
PROGRAM Buggers;
USES Crt;
TYPE
Feld = Array [1..5,1..5] OF INTEGER;
Farbfeld = Array [0..9] OF INTEGER;
VAR
sf: Feld;
f: Farbfeld;
zufallskeim,modulo,sgrad: INTEGER;
PROCEDURE GetInt(VAR int:INTEGER; VAR error:BOOLEAN);
VAR s: STRING[6];
wert,fehl: INTEGER;
BEGIN
READLN(s);
VAL(s,wert,fehl);
IF ((fehl>0) OR (s="") OR (s="+") OR (s="-")) THEN BEGIN
error:=TRUE;
wert:=0;
END ELSE error:=FALSE;
int:=wert;
END;
FUNCTION Unfinished(vAR sf:Feld; modulo:Integer):Boolean;
VAR h: Boolean;
i,j: Integer;
BEGIN
h:=FALSE;
FOR i:=1 TO 5 DO
FOR j:=1 TO 5 DO
IF sf[i,j]<>modulo THEN h:=TRUE;
Unfinished:=h;
END;
PROCEDURE Addition(VAR sf:Feld; x,y,modulo: Integer);
VAR i: Integer;
BEGIN
FOR i:=1 TO 5 DO BEGIN
sf[x,i]:=(sf[x,i]+1) MOD (modulo+1);
IF i<>x THEN sf[i,y]:=(sf[i,y]+1) MOD (modulo+1);
END;
END;
PROCEDURE Subtraktion(VAR sf:Feld; x,y,modulo:INTEGER);
VAR i: INTEGER;
BEGIN
FOR i:=1 TO 5 DO BEGIN
sf[x,i]:=sf[x,i]-1;
IF sf[x,i]<0 THEN sf[x,i]:=modulo;
IF i<>x THEN BEGIN
sf[i,y]:=sf[i,y]-1;
IF sf[i,y]<0 THEN sf[i,y]:=modulo;
END;
END;
END;
PROCEDURE BuggersIntro(VAR keim,sgrad,modulo:INTEGER);
VAR i: INTEGER;
fehl: BOOLEAN;
BEGIN
ClrScr;
GOTOXY(1,6);
WRITELN("Willkommen bei Buggers!");
WRITELN;
WRITELN("Ziel des Spiels ist es, alle Felder");
WRITELN("auf den höchsten Wert zu setzen.");
WRITELN("Dazu geben Sie eine Zeile und Spalte");
WRITELN("an, deren Felder dann um eins erhöht");
WRITELN("werden.Wird über das Maximum erhöht,");
WRITELN("so wird der Wert Null angenommen. Es");
WRITELN("gibt die Möglichkeit, ein Spiel vor-");
WRITELN("zeitig zu beenden, sowie den letzten");
WRITELN("Zug rückgängig zu machen. Der");
WRITELN("Schwierigkeitsgrad gibt die Zahl der");
WRITELN("mindestens benötigten Züge an.");
GOTOXY(40,7);
WRITE("|=================|");
GOTOXY(40,8);
WRITE("| B U G G E R S |");
GOTOXY(40,9);
WRITE("|=================|");
GOTOXY(40,11);
WRITE("© 1990");
GOTOXY(40,12);
WRITE("von Stephan Körting");
GOTOXY(40,13);
WRITE("adapted and converted by Sebastian Erbert");
fehl:=TRUE;
keim:=0;
WHILE fehl DO BEGIN
GOTOXY(10,20);
WRITE("Geben sie bitte eine beliebige Zahl ein: ");
GetInt(keim,fehl);
GOTOXY(10,20);
WRITE(" ");
END;
fehl:=TRUE;
WHILE fehl DO BEGIN
GOTOXY(10,20);
WRITE("Geben Sie bitte den Schwierigkeitsgrad ein: ");
GetInt(sgrad,fehl);
GOTOXY(10,20);
WRITE(" ");
END;
fehl:=TRUE;
modulo:=0;
WHILE (fehl OR (modulo>9) OR (modulo<1)) DO BEGIN
GOTOXY(10,20);
WRITE("Geben Sie bitte die höchste Ziffer ein: ");
GetInt(modulo,fehl);
GOTOXY(10,20);
WRITE(" ");
END;
FOR i:=6 TO 18 DO BEGIN
GOTOXY(1,i);
WRITE(" ");
END;
FOR i:=0 TO modulo DO f[i]:=i+5;
END;
PROCEDURE InitSpielfeld(VAR sf:feld; modulo:INTEGER);
VAR i,j: INTEGER;
BEGIN
FOR i:=1 TO 5 DO
FOR j:=1 TO 5 DO sf[i,j]:=modulo;
END;
PROCEDURE ZerhackeSpielfeld(VAR sf:Feld; sg,zuf,modulo: INTEGER);
CONST ug = 1;
og = 5;
VAR i,x,y: INTEGER;
FUNCTION Zufall(VAR keim:INTEGER; ug,og:INTEGER):INTEGER;
CONST m = 2345;
f = 3;
ink = 7227;
VAR h: INTEGER;
BEGIN
keim:=(f*keim+ink) MOD m;
h:=TRUNC((keim/m)*(og-ug+1)+ug);
IF h<ug THEN h:=ug;
IF h>og THEN h:=og;
Zufall:=h;
END;
BEGIN { procedure main }
FOR i:=1 TO sg DO BEGIN
x:=Zufall(zuf,ug,og);
y:=Zufall(zuf,ug,og);
Subtraktion(sf,x,y,modulo);
END;
END;
PROCEDURE ZeigeSpielfeld(sf:Feld);
VAR i,j: INTEGER;
BEGIN
GOTOXY(1,6);
WRITELN(" ");
FOR j:=1 TO 5 DO BEGIN
WRITE(" ");
FOR i:=1 TO 5 DO BEGIN
WRITE(" ");
WRITE(sf[i,j]:2);
END;
WRITELN(" ");
IF j<5 THEN WRITELN(" ")
ELSE WRITELN(" ");
END;
END;
PROCEDURE Spiele(VAR sf:Feld; sg,modulo:Integer);
VAR x,y,xneu,yneu: Integer;
fehler: Boolean;
zug,zugmax: Integer;
wahl: Char;
BEGIN
zugmax:=2*sg;
zug:=1;
GOTOXY(40,14);
WRITE(" GRAD: ",sgrad:3);
WHILE (Unfinished(sf,modulo) AND (zug<=zugmax)) DO BEGIN
GOTOXY(40,14);
WRITE("ZUG: ",zug:3);
GOTOXY(10,20);
WRITE(" ");
GOTOXY(10,21);
WRITE(" ");
GOTOXY(10,20);
WRITE("??? [+] - Ziehen [R] - Zurücknehmen [A] - Abbruch ??? ");
REPEAT
UNTIL Keypressed;
wahl:=Readkey;
GOTOXY(10,20);
WRITE(" ");
CASE wahl OF
"+": BEGIN
fehler:=TRUE;
WHILE fehler DO BEGIN
GOTOXY(10,20);
WRITE(" ");
GOTOXY(10,20);
WRITE("Geben Sie bitte die Zeile ein: ");
GetInt(yneu,fehler);
END;
IF ((0<yneu) AND (yneu<6)) THEN BEGIN
fehler:=TRUE;
WHILE fehler DO BEGIN
GOTOXY(10,21);
WRITE(" ");
GOTOXY(10,21);
WRITE("Geben Sie bitte die Spalte ein: ");
GetInt(xneu,fehler);
END;
IF ((0<xneu) AND (xneu<6)) THEN BEGIN
x:=xneu;
y:=yneu;
Addition(sf,x,y,modulo);
zug:=Succ(zug);
END ELSE BEGIN
GOTOXY(10,21);
WRITE("Ihre Eingabe muß im Bereich von 1 bis 5 liegen ! {TASTE]");
Waitforkey;
GOTOXY(10,21);
WRITE(" ");
END;
END ELSE BEGIN
GOTOXY(10,20);
WRITE("Ihre Eingabe muß im Bereich von 1 bis 5 liegen ! [TASTE]");
Waitforkey;
GOTOXY(10,20);
WRITE(" ");
END;
END;
"r","R": IF ((zug>1) AND (x<>-1)) THEN BEGIN
Subtraktion(sf,x,y,modulo);
Dec(zug);
x:=-1;
END ELSE BEGIN
GOTOXY(10,20);
WRITE("Leider geht das jetzt nicht ! [TASTE]");
Waitforkey;
END;
"a","A": BEGIN
GOTOXY(10,20);
WRITE("Wollen Sie diese Partie wirklich abbrechen (J/N) ?");
READLN(wahl);
IF ((wahl="j") OR (Wahl="J")) THEN zug:=zugmax+1;
END;
OTHERWISE;
END;
ZeigeSpielfeld(sf);
END;
END;
FUNCTION Auswertung(sf:Feld; modulo:Integer):Boolean;
VAR h: Boolean;
antwort: Char;
BEGIN
GOTOXY(10,20);
WRITE(" ");
GOTOXY(10,21);
WRITE(" ");
GOTOXY(10,20);
IF Unfinished(sf,modulo) THEN
WRITE("Schade, aber vielleicht haben Sie das nächste Mal mehr Glück !")
ELSE WRITE("Herzlichen Glückwunsch");
GOTOXY(10,21);
WRITE("Möchten Sie noch eine Partie spielen (J/N) ? ");
READLN(antwort);
IF ((antwort="j") OR (antwort="J")) THEN h:=TRUE ELSE h:=FALSE;
GOTOXY(10,21);
WRITE(" ");
Auswertung:=h;
END;
BEGIN { main }
REPEAT
BuggersIntro(zufallskeim,sgrad,modulo);
InitSpielfeld(sf,modulo);
ZerhackeSpielfeld(sf,sgrad,zufallskeim,modulo);
ZeigeSpielfeld(sf);
Spiele(sf,sgrad,modulo);
UNTIL NOT Auswertung(sf,modulo);
GOTOXY(10,23);
WRITELN("Auf Wiedersehen !");
Delay(1*50);
ClrScr;
END.